package helpers {
  import models.vo.Estado;
  import models.vo.Incentivo;
  import models.vo.SetorEconomico;

  import org.restfulx.Rx;
  import org.restfulx.collections.ModelsCollection;
  import org.restfulx.events.CacheUpdateEvent;
  import org.restfulx.utils.TypedArray;

  [Bindable]
  public class ModelsManager {
    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public static var manager:ModelsManager;

    public var setoresEconomicos:ModelsCollection;

    public var incentivos:ModelsCollection;

    public var estados:ModelsCollection;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function ModelsManager(enforcer:SingletonEnforcer) {
      Rx.models.addEventListener(CacheUpdateEvent.ID, onCacheUpdate);
      Rx.models.index(SetorEconomico, onIndexSetorEconomicoSuccess);
      Rx.models.index(Incentivo, onIndexIncentivoSuccess, null, null, null, false);
      Rx.models.index(Estado, onIndexEstadoSuccess);
    }

    private function onIndexSetorEconomicoSuccess(result:Object):void {
      setoresEconomicos = new ModelsCollection(result as TypedArray);
    }

    private function onIndexIncentivoSuccess(result:Object):void {
      incentivos = new ModelsCollection(result as TypedArray);
    }

    private function onIndexEstadoSuccess(result:Object):void {
      estados = new ModelsCollection(result as TypedArray);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    private function onCacheUpdate(event:CacheUpdateEvent):void {
      if (event.isFor(SetorEconomico))
        setoresEconomicos = Rx.models.cached(SetorEconomico);
      else if (event.isFor(Incentivo))
        incentivos = Rx.models.cached(Incentivo);
      else if (event.isFor(Estado))
        estados = Rx.models.cached(Estado);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public static function get instance():ModelsManager {
      initialize();
      return manager;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public static function initialize():void {
      if (!manager)
        manager = new ModelsManager(new SingletonEnforcer);
    }
  }
}

class SingletonEnforcer {
}